package com.guaoran.source.spring.framework.aop;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @author : 孤傲然
 * @Description :
 *  用来配置AOP的切面配置信息：哪些类的哪些方法需要增强，增强的内容是什么
 *  只是对application中的expression的封装，
 *  对目标对象的一个方法的增强，在调用某个方法前后去操作其他的方法，实现业务逻辑的增强
 *
 * @date :2018/7/4 8:05
 */
public class AopConfig {
    /**
     * 用来存储aop的增强信息，即：哪个方法执行的时候会调用哪个类的哪些方法进行增强处理
     */
    private Map<Method,Aspect> points  = new HashMap<Method,Aspect>();

    /**
     * 保存aop增强信息
     * @param target：要增强的方法
     * @param aspect：增强时需要调用哪个类
     * @param points：增强时需要调用aspect类的哪些方法
     */
    public void put(Method target,Object aspect,Method[] points){
        this.points.put(target,new Aspect(aspect,points));
    }

    /**
     * 根据要增强的方法获得增强的调用信息
     * @param target
     */
    public Aspect get(Method target){
        return this.points.get(target);
    }

    /**
     * 查询要增强的方法是否已经存储下来
     * @param target
     * @return
     */
    public boolean contains(Method target){
        return this.points.containsKey(target);
    }
    /**
     * 在增强处理的时候，需要调用哪个类的哪个方法,将结果进行封装
     */
    public class Aspect{
        /**在增强处理的时候，需要调用哪个类*/
        private Object aspect;
        /**在增强处理的时候，需要调用哪些方法*/
        private Method[] points;

        public Aspect(Object aspect, Method[] points) {
            this.aspect = aspect;
            this.points = points;
        }

        public Object getAspect() {
            return aspect;
        }

        public void setAspect(Object aspect) {
            this.aspect = aspect;
        }

        public Method[] getPoints() {
            return points;
        }

        public void setPoints(Method[] points) {
            this.points = points;
        }
    }
}
